1、如果保护模式使maximum protection mode,在主库宕掉的情况下使用failover必须将备库的保护模式切换为maximium performance才能执行切换操作
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
2、手动执行switchover进行角色切换
2.1、确认主库的状态,是否可以切换为备库角色
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
只有值为TO STANDBY或者SESSIONS ACTIVE才表示主库可以被切换为备库,如果不是这两个值,则不能进行切换(可能redo transport配置问题或者功能异常)
2.2、开始主库执行切换
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
如果2.1查到的值为to standy,那么执行上面的语句可以省略WITH SESSION SHUTDOWN
2.3、关闭数据库,并启动到mount状态
1 | SQL> SHUTDOWN ABORT; |
2.4、从库查询切换状态是否可以切换为主库
1 | SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; |
只有值为TO_PRIMARY或者SESSIONS ACTIVE才表示备库可以切换为主库角色,如果不是这两个值,需要确认redo apply是否激活和redo transport状态是否正常。
2.5、备库执行切换为主库角色
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
如果2.4查到的值为to_primary,可以省略WITH SESSION SHUTDOWN
2.6、打开新的主库
ALTER DATABASE OPEN;
2.7、在新的从库启用redo apply
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
3、当主库宕机无法启动,使用failover的方式切换备库为主库
3.1、如果主库是处在mount状态,没办法open的情况下,可以使用下面命令把未传送到备库的archive和redo发送到备库,以确保数据不丢失
SQL> ALTER SYSTEM FLUSH REDO TO target_db_name;
target_db_name为备库的DB_UNIQUE_NAME
3.2、如果主库不能够被mount,但是主库的操作系统可以被正常访问,备库查看每个日志线程的最高日志序列号
1 | 03:48:57 SYS@ cbislave> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) OVER (PARTITION BY thread#) AS LAST from V$ARCHIVED_LOG; |
主库的归档日志对应为-rw-r----- 1 oracle oinstall 172M Sep 6 03:48 1_45_1017616040.dbf
把当前45号及以后的归档拷贝到从库,并把丢失的日志注册到从库,注册命令如下:SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
3.3、查看和解决归档日志间隙
查看视图v$ARCHIVE_GAP,来查看备库是否有redo gap
1 | SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP; |
上面例子中线程1存在序列号为90、91、92的归档日志间隙,如果可以在主库找到对应的归档日志,拷贝到备库,进行日志注册SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
3.4、如果3.2和3.3的步骤都没办法操作(比如主节点没办法访问),那么只能执行后面的切换,会丢失数据
3.5、备库停止redo apply
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
3.6、结束应用所有收到的redo data
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
如果这一步没有报错,进行下一步操作。如果提示错误,一些收到的redo data没有被应用,试着解决提示的错误在执行下一步。如果3.2、3.3、3.4提到的日志间隙没有解决也会提示对应的日志间隙的错误。如果错误不能解决,在备库执行下面语句(面临数据丢失)SQL> ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
3.7、备库查看切换状态
1 | SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; |
值为TO PRIMARY或者session active表示可以切换为主库角色。
3.8、备库切换为主库角色
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
3.7查到的值为to_primary,可以省略WITH SESSION SHUTDOWN
3.9、打开新的主库
SQL> ALTER DATABASE OPEN;
3.10、新的主库起来之后建议执行以下全库备份
4、经过上面3的步骤之后,旧的主库(如果能起来的话)不可用了,但是可以使用flashback database方法切换为备库
4.1、在新的主库(旧的备库)上查看旧的备库切换为新的额主库的scn值
SQL> SELECT TO_CHAR(STANDBY_BECAME_PRIMARY_SCN) FROM V$DATABASE;
4.2、在旧的主库上执行闪回,将其闪回到4.1查询到的scn号
1 | SQL> SHUTDOWN IMMEDIATE; |
4.3、下面切换旧的主库为物理备库
1 | SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY; |
4.4、开始向新的备库(旧的主库)传输redo
在新的主库上先执行下面语句
4.4.1、查看归档地址状态
SQL> SELECT DEST_ID, DEST_NAME, STATUS, PROTECTION_MODE, DESTINATION,ERROR,SRL FROM V$ARCHIVE_DEST_STATUS;
4.4.2、如果有必要启用地址
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_n=ENABLE;
4.4.3、执行日志切换,确保新的备库可以收到redo
1 | SQL> ALTER SYSTEM SWITCH LOGFILE; |
4.5、新的备库启动redo apply
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;